// 引入拖拽模块
layui.extend({
    soulTable:'soulTable/soulTable.slim',// 拖拽模块
})


// 对layuiAdmin 后台封装一些方法， 减少html 页面中代码量
var table = layui.table
var form = layui.form
var util = layui.util

// 字段允许为空
form.verify({
    phone: [/(^$)|^1\d{10}$/, "请输入正确的手机号"],
    email: [/(^$)|^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/, "邮箱格式不正确"],
    url: [/(^$)|(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/, "链接格式不正确"],
    number: [/(^$)|^\d+$/,'只能填写数字'],
    date: [/(^$)|^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/, "日期格式不正确"],
    identity: [/(^$)|(^\d{15}$)|(^\d{17}(x|X|\d)$)/, "请输入正确的身份证号"]
});

// 刷新表格数据
window.refreshTable = function(param) {
    table.reloadData("data-table", {
        scrollPos: "fixed"
    });
}

// 表格初始化渲染
function layuiRender(option){
    var defaultOption = {
        elem: "#data-table",
        //url: '',
        page: true,
        cols: [],
        skin: "row",// line 行边框风格  row 列边框风格  nob 无边框
        even:true,// 隔行换色
        size: "lg",
        toolbar: "#table-toolbar",
        autoSort: false,
        where:{},// 初始查询条件
        limits: [10,50,100,300,500,999],
        limit:10,
        defaultToolbar: [{
            title: "刷新",
            layEvent: "refresh",
            icon: "layui-icon-refresh",
        }, "filter", "print", "exports"],
        done: function () {
            layer.photos({photos: 'div[lay-id="data-table"]', anim: 5});
            // 记录筛选项
            layuiTableFilterSet(this,option.url)
            // 如果有配置该参数  则绑定拖拽表单
            if(option.rowDrag){
                layui.soulTable.render(this);
            }
        }}

    // 合并配置项
    option = Object.assign(defaultOption,option)
    table.render(option);
}

// 表格顶部搜索事件
function layuiFormQuery(domStr,tableId){
    tableId = tableId || 'data-table';
    form.on("submit("+domStr+")", function(data) {
        table.reload(tableId, {
            page: {
                curr: 1
            },
            where: data.field
        })
        return false;
    });
}

// 表格顶部搜索重置事件
function layuiFormReset(domStr,tableId){
    tableId = tableId || 'data-table';
    form.on("submit("+domStr+")", function(data) {
        table.reload(tableId, {
            where: []
        })
    });
}
// 表格排序事件
function layuiTableSort(tableId){
    tableId = tableId || 'data-table';
    table.on("sort("+tableId+")", function(obj){
        table.reload(tableId, {
            initSort: obj,
            scrollPos: "fixed",
            where: {
                field: obj.field,
                order: obj.type
            }
        });
    });
}

/**
 * 列表中 下拉选项的渲染
 return layuiTemplet(d,"bind_uid",apiResults)
 * @param d 表格数据
 * @param field  字段名
 * @param apiResults  接口返回值列表
 * @returns {*|string}
 */
function layuiTemplet(d,field,apiResults){
    if (typeof d[field] == "undefined") return "";
    let items = [];
    layui.each((d[field] + "").split(","), function (k , v) {
        items.push(apiResults[field][v] || v);
    });
    return util.escape(items.join(","));
}

/**
 * 模板 下拉搜索组件 Api版本
 * @param field 表字段
 * @param url 接口请求地址
 * @param label 别名
 * @param name 组件name  留空默认同表字段
 */
function templetSelectApi(field,url,label,name){
    name = name|| field
    layui.use(["jquery", "xmSelect", "popup"], function() {
        layui.$.ajax({
            url: url,
            dataType: "json",
            success: function (res) {
                let value = layui.$("#" + field).attr("value");
                let initValue = value ? value.split(",") : [];
                layui.xmSelect.render({
                    el: "#" + field,
                    name: name,
                    initValue: initValue,
                    filterable: true,
                    tips:  label,
                    data: res.data,
                    placeholder:label,
                    model: {"icon": "hidden", "label": {"type": "text"}},
                    clickClose: true,
                    radio: true,
                });
                if (res.code) {
                    layui.popup.failure(res.msg);
                }
            }
        });
    })
}

/**
 * 模板 下拉搜索组件
 * @param field  字段名
 * @param data  下拉选项参数  [{"value":"1","name":"是"},{"value":"2","name":"否"}]
 * @param label 别名
 * @param name 标签名 默认同字段名
 */
function templetSelect(field,data,label,name){
    name = name || field
    layui.use(["jquery", "xmSelect"], function() {
        let value = layui.$("#"+field).attr("value");
        let initValue = value ? value.split(",") : [];
        layui.xmSelect.render({
            el: "#"+field,
            name: name,
            filterable: true,
            tips: label,
            initValue: initValue,
            data: data,
            placeholder: label,
            model: {"icon":"hidden","label":{"type":"text"}},
            clickClose: true,
            radio: true,
        })
    });
}


/**
 * 在 insert 或者 update 页面时 进行数据提交时使用
 * @param url  提交接口
 * @param defaultMsg  后台未定义提示是 默认提示消息
 */
function templetsubmitSave(url,defaultMsg){
    defaultMsg = defaultMsg ||'操作成功';
    layui.use(["form", "popup"], function () {
        // 字段验证允许为空
        layui.form.verify({
            phone: [/(^$)|^1\d{10}$/, "请输入正确的手机号"],
            email: [/(^$)|^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/, "邮箱格式不正确"],
            url: [/(^$)|(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/, "链接格式不正确"],
            number: [/(^$)|^\d+$/,'只能填写数字'],
            date: [/(^$)|^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/, "日期格式不正确"],
            identity: [/(^$)|(^\d{15}$)|(^\d{17}(x|X|\d)$)/, "请输入正确的身份证号"]
        });
        layui.form.on("submit(save)", function (data) {
            // 如果是更新的话  追加主键字段
            if(url.indexOf('update')!=-1){
                data.field[PRIMARY_KEY] = layui.url().search[PRIMARY_KEY];
            }
            layui.$.ajax({
                url: url,
                type: "POST",
                dateType: "json",
                data: data.field,
                success: function (res) {
                    if (res.code) {
                        return layui.popup.failure(res.msg);
                    }
                    let msg = ''
                    if(!res.msg || res.msg =='ok'){
                        msg = defaultMsg
                    }else{
                        msg = res.msg
                    }
                    return layui.popup.success(msg, function () {
                        parent.refreshTable && parent.refreshTable();
                        parent.layer.close(parent.layer.getFrameIndex(window.name));
                    });
                }
            });
            return false;
        });
    });
}


// 通过URL打开一个弹窗
function layerOpen(title,content,width,height){
    var common = layui.common
    width = width || '600px';
    height = height || '500px';
    layer.open({
        type: 2,
        title: title,
        shade: 0.1,
        maxmin: true,
        shadeClose:true,// 点击阴影 关闭弹窗
        area: [common.isModile()?"100%":width, common.isModile()?"100%":height],
        content:content
    });
}

// 执行删除
function layuiDoRemove (ids,PRIMARY_KEY,DELETE_API) {
    let data = {};
    data[PRIMARY_KEY] = ids;
    layer.confirm("确定删除?", {
        icon: 3,
        title: "提示"
    }, function(index) {
        layer.close(index);
        let loading = layer.load();
        layui.$.ajax({
            url: DELETE_API,
            data: data,
            dataType: "json",
            type: "post",
            success: function(res) {
                layer.close(loading);
                if (res.code) {
                    return layui.popup.failure(res.msg);
                }
                return layui.popup.success("操作成功", refreshTable);
            }
        })
    });
}

// 将 新增和删除 的方法 汇总起来， 方便CURD 的时候使用
function lauiInit(PRIMARY_KEY,INSERT_URL,UPDATE_API,DELETE_API){
    var common = layui.common
    return {
        add:function() {
            layerOpen('新增',INSERT_URL)
        },
        edit:function(obj) {
            let value = obj.data[PRIMARY_KEY];
            layerOpen('修改',UPDATE_API + "?" + PRIMARY_KEY + "=" + value)
        },
        remove:function(obj) {
            return layuiDoRemove(obj.data[PRIMARY_KEY],PRIMARY_KEY,DELETE_API)
        },
        batchRemove:function(obj) {
            let checkIds = common.checkField(obj, PRIMARY_KEY);
            if (checkIds === "") {
                layui.popup.warning("未选中数据");
                return false;
            }
            layuiDoRemove(checkIds.split(","),PRIMARY_KEY,DELETE_API)
        },
        /**
         * 模版 开关组件
         * @param d d
         * @param field 字段名称
         * @param text 开关字样 默认为  启用|禁用
         * @returns {string}
         */
        templetSwitch:function (d,field,text){
            text = text || "启用|禁用";
            form.on("switch("+field+")", function (data) {
                let load = layer.load();
                let postData = {};
                postData[field] = data.elem.checked ? 1 : 0;
                postData[PRIMARY_KEY] = this.value;
                layui.$.post(UPDATE_API, postData, function (res) {
                    layer.close(load);
                    if (res.code) {
                        return layui.popup.failure(res.msg, function () {
                            data.elem.checked = !data.elem.checked;
                            form.render();
                        });
                    }
                    return layui.popup.success("操作成功");
                })
            });
            let checked = d[field] === 1 ? "checked" : "";
            return '<input type="checkbox" value="'+util.escape(d[PRIMARY_KEY])+'" lay-filter="'+util.escape(field)+'" lay-skin="switch" lay-text="'+util.escape(text)+'" '+checked+'/>';
        },
        /**
         * 拖拽表格 进行排序
         * @param obj  当前拖拽对象
         * @param tableId  表的主键ID
         * @param updateUrl  更新数据的接口
         * @param weightField  排序字段
         */
        rowDragDoneFunc:function(obj,weightField){
            weightField = weightField || 'weight';
            // 获取最新位置 前后数据的id
            var beforId = afterId = 0;
            if(obj.newIndex > 0){
                beforId = obj.cache[obj.newIndex-1][PRIMARY_KEY]
            }
            if(obj.newIndex < obj.cache.length-1){
                afterId = obj.cache[obj.newIndex+1][PRIMARY_KEY]
            }
            var data = {
                dragDone:1,// 增加数据标识  方便后台接口进行判断
                id:obj.row[PRIMARY_KEY],
                field:weightField,
                beforId,afterId
            }
            // 提交数据进行排序更新
            layui.$.post(UPDATE_API,data,function(res){
                if(res.code){
                    layui.layer.msg(res.msg,{icon:5});
                }else{
                    obj.row[weightField] =res.data;
                    refreshTable();
                }
            })
        }
    }
}


/**  表格扩展功能  增加 表格的状态编辑 */
// 读取初始化表格的变动
function layuiTableFilter(key,cols){
    var local = layui.data('filter:'+key)
    if(local){
        if(local?.editStatus == 1){
            // 读取设置
            layui.each(cols,function(index,item){
                if(item.field in local){
                    item.hide = true
                }else{
                    item.hide = false
                }
            })
        }else{
            // 初始化设置
            layui.each(cols,function(index,item){
                if(item.hide){
                    // 加入隐藏
                    layui.data ('filter:'+key, {key: item.field,value: 1})
                }
            })
            layui.data ('filter:'+key, {key: 'editStatus',value: 1})
        }
    }

    // 获取宽度
    var widths = layui.data('width:'+key)
    if(widths && widths.editStatus == 1){
        layui.each(cols,function(index,item){
            if(item.field in widths){
                item.width = parseInt(widths[item.field])
            }
        })
    }

    return cols;
}

// 记录表格的变动情况
function layuiTableFilterSet(that,key){
    let $ = layui.$;
    if(localStorage.getItem('filter:'+key)!=null){
        that.elem.next().on('mousedown', 'input[lay-filter="LAY_TABLE_TOOL_COLS"]+', function(){
            var input = $(this).prev()[0];
            if (input.checked === true){  // 复选框取消，则加入本地缓存标识
                layui.data ('filter:'+key, {key: input.name,value: !input.checked})
                layui.data ('filter:'+key, {key: 'editStatus',value: 1})
            }else {  // 复选框勾上，则移除本地标识
                layui.data('filter:'+key, {key: input.name, remove: true});
            }
        })
    }
    if(localStorage.getItem('width:'+key)!=null){
        that.elem.next().on('mouseup', 'th', function(){
            var field = $(this).data('field')
            var width = $(this).children('.layui-table-cell').css('width').replaceAll('px','');
            layui.data ('width:'+key, {key: field,value:width})
            layui.data ('width:'+key, {key: 'editStatus',value: 1})
        })
    }
}


/**
 * 自定义导出方法  有修改layui.js原文件  关键字【exportFile】
 * @param s   整个配置小心
 * @param config  render 配置信息
 * @param exportType  导出方式  csv 或者 xls
 * 用法：exportAction:layuiExportAction
 */
function layuiExportAction(s,config, exportType) {
    var table = layui.table;
    var selectedData = table.checkStatus(`${config.id}`).data;
    if (selectedData && selectedData.length > 0) {
        //导出选中的数据
        table.exportFile(config.id, selectedData , exportType);
    } else {
        //导出后端接口的数据,
        var querydata = layui.form.val(`${config.id}-queryForm`);  //获取查询form的查询条件参数
        $.ajax({
            type: config.exportMethod || "get",
            url: config.exportDataUrl,
            contentType: "application/json",
            data: querydata,
            dataType: "json",
            headers: {},
            success: function (rspData) {
                // alert(JSON.stringify(rspData));
                table.exportFile(config.id, rspData.data, exportType);
            }, error: function (data) {
                layui.layer.msg("error: " + data.responseText, { icon: 2 });
            }
        })
    }
}
